class Solution {
public:
    int longestSubstring(string s, int k) {
        int hash[26] = {0};
        for(auto e:s)
        {
            hash[e-'a']++;
        }//记录每一个字符出现的次数
        vector<int> spilt;
        for(int i = 0;i<s.size();i++)
        {
            if(hash[s[i]-'a']<k)
            {
                spilt.push_back(i);//这个字符绝对不可能出现在答案子串中
            }
        }
        if(spilt.size() == 0)
        {
            return s.size();//当前这个字符串是符合条件的字符串，所有字符出现的次数都是大于k的
        }
        int left = 0;
        int ans = 0;
        spilt.push_back(s.size());//作用是为了在分割点数组 spilt 的末尾添加一个元素，
        //该元素的值等于字符串 s 的长度。这个操作是为了确保字符串 s 的最后一个字符之后也被视为一个分割点，
        //从而能够正确处理字符串末尾到结束之间的部分。
        for(int i = 0;i<spilt.size();i++)
        {
            int len = spilt[i] - left;
            if(len>ans)
            {
                ans = max(longestSubstring(s.substr(left,len),k),ans);//递归处理拆分出来的字符串
            }
            left = spilt[i]+1;//下一次分割的开始就从spilt[i]+1位置开始
        }
        return ans;
    }
};